package com.ruoyi.media.service.impl;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Objects;

import com.ruoyi.media.domain.dto.ImagesDTO;
import com.ruoyi.media.domain.vo.ImageVO;
import com.ruoyi.media.mapper.ImageTagMapper;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.media.mapper.ImagesMapper;
import com.ruoyi.media.domain.Images;
import com.ruoyi.media.service.IImagesService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 图片管理Service业务层处理
 * 
 * @author crocodilePole
 * @date 2024-11-14
 */
@Service
public class ImagesServiceImpl implements IImagesService 
{

    private static final Logger log = LoggerFactory.getLogger("com.ruoyi.log.UserAccess");

    @Autowired
    private ImagesMapper imagesMapper;

    @Autowired
    private ImageTagMapper imageTagMapper;

    @Autowired
    private MinIOFileStorageService fileStorageService;

    /**
     * 查询图片管理
     * 
     * @param id 图片管理主键
     * @return 图片管理
     */
    @Override
    public Images selectImagesById(Long id)
    {
        return imagesMapper.selectImagesById(id);
    }

    /**
     * 查询图片管理列表
     * 
     * @param images 图片管理
     * @return 图片管理
     */
    @Override
    public List<Images> selectImagesList(Images images)
    {

        return imagesMapper.selectImagesList(images);
    }

    /**
     * 新增图片管理
     * 
     * @param images 图片管理
     * @return 结果
     */
    @Override
    public int insertImages(ImagesDTO images)
    {
//        1、新增图片表
        int result = imagesMapper.insertImages(images);
//        2、新增图片标签关联表
        imageTagMapper.insert(images.getId(), images.getTagIds());
        return result;
    }

    /**
     * 修改图片管理
     * 
     * @param images 图片管理
     * @return 结果
     */
    @Transactional
    @Override
    public int updateImages(ImagesDTO images)
    {
//        1、更新图片表
        int result = imagesMapper.updateImages(images);
//        2、根据图片id删除关联表的数据
        imageTagMapper.deleteById(images.getId());
//        3、更新图片与标签的关联表
        imageTagMapper.insert(images.getId(), images.getTagIds());

        return result;
    }

    /**
     * 批量删除图片管理
     * 
     * @param ids 需要删除的图片管理主键
     * @return 结果
     */
    @Override
    public int deleteImagesByIds(Long[] ids)
    {
        //删除之前做查询
        List<Images> imgList = imagesMapper.getImageInfosByIds(ids);
        if(imgList.isEmpty()){
            return 0;
        }
        int result = imagesMapper.deleteImagesByIds(ids);
//        //删除minio中的图片
        deleteMinioImages(imgList);

        return result;
    }

    //遍历删除minio中的图片
    private void deleteMinioImages(List<Images> imgList) {
        for (Images img : imgList) {
            String pathUrl = img.getStoragePath();
            fileStorageService.delete(pathUrl);
        }
    }

    /**
     * 删除图片管理信息
     * 
     * @param id 图片管理主键
     * @return 结果
     */
    @Override
    public int deleteImagesById(Long id)
    {
        return imagesMapper.deleteImagesById(id);
    }

    /**
     * 图片列表，多表联查
     * @param imagesDTO
     * @return
     */
    @Override
    public List<ImageVO> imagesList(ImagesDTO imagesDTO) {
        log.info("开始查询图片列表");
        log.info("查询图片列表参数：{}", imagesDTO);

//        处理时间范围
        LocalDateTime uploadTime = imagesDTO.getUploadTime();
        LocalDateTime endTime = imagesDTO.getEndTime();
        if(!Objects.isNull(uploadTime) && Objects.isNull(endTime)){
            // 如果没有设置时间范围，则设置默认时间范围
             endTime = LocalDateTime.of(uploadTime.toLocalDate(), LocalTime.MAX);
             imagesDTO.setEndTime(endTime);
        }
        List<ImageVO> imageVOS = imagesMapper.imagesList(imagesDTO);
        log.info("查询图片列表结果：{}", imageVOS.get(0));
        return imageVOS;
    }


}
